// main.c
// Jedi Academy Server Log Converter - Version 2.0
// 
// Created By Steven Mattera on August 30th 2010.
// Copyright (c) 2010 Steven Mattera <stevenmattera@gmail.com>
//
// Jedi Academy Server Log Converter is free software; you can 
// redistribute it and/or modify it under the terms of the GNU General 
// Public License as published by the Free Software Foundation; either 
// version 2 of the License, or (at your option) any later version.
//
// Jedi Academy Server Log Converter is distributed in the hope that it 
// will be useful, but WITHOUT ANY WARRENTY; without even the implied 
// warrenty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more deails.
//
// You should have received a copy of the GNU General Public License
// along with Jedi Academy Server Log Converter; if not, write to the Free 
// Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
// USA
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "resource.h"

enum {
	ID_LOADEDIT = 1,
	ID_LOADBUTTON,
	ID_SAVEEDIT,
	ID_SAVEBUTTON,
	ID_CONVERTBUTTON
};

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	WNDCLASSEX wc;
	MSG Msg;
	HWND hwnd;
	
	wc.cbSize			= sizeof(WNDCLASSEX);
	wc.style			= 0;
	wc.lpfnWndProc		= WndProc;
	wc.cbClsExtra		= 0;
	wc.cbWndExtra		= 0;
	wc.hInstance		= hInstance;
	wc.hIcon			= LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON));
	wc.hCursor			= LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground	= GetSysColorBrush(COLOR_3DFACE);
	wc.lpszMenuName		= NULL;
	wc.lpszClassName	= "mainWindow";
	wc.hIconSm			= (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON), IMAGE_ICON, 16, 16, 0);
	
	if (!RegisterClassEx(&wc)) {
		MessageBox(NULL, "Window Registration Failed!", "Error", MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}
	
	hwnd = CreateWindowEx(0, "mainWindow", "Jedi Academy Server Log Converter", WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX, (GetSystemMetrics(SM_CXSCREEN) - 500)/2, (GetSystemMetrics(SM_CYSCREEN) - 72)/2, 500, 100, NULL, NULL, hInstance, NULL);
	
	if (hwnd == NULL) {
		MessageBox(NULL, "Window Creation Failed!", "Error", MB_ICONEXCLAMATION|MB_OK);	
		return 0;
	}
	
	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);
	
	MessageBox(hwnd, "Jedi Academy Server Log Converter\nCopyright (c) 2010 Steven Mattera <stevenmattera@gmail.com>\n\nJedi Academy Server Log Converter is free software; you can redistribute it\nand/or modify it under the terms of the GNU General Public License as published\nby the Free Software Foundation; either version 2 of the License, or (at your\noption) any later version.\n\nJedi Academy Server Log Converter is distributed in the hope that it will be\nuseful, but WITHOUT ANY WARRENTY; without even the implied warrenty of \nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\nLicense for more deails.\n\nYou should have received a copy of the GNU General Public License along with\nJedi Academy Server Log Converter; if not, write to the Free Software\nFoundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA", "Welcome to Jedi Academy Server Log Converter", MB_OK);	
	
	while(GetMessage(&Msg, NULL, 0, 0) > 0) {
		TranslateMessage(&Msg);
		DispatchMessage(&Msg);
	}
	
	return Msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
	char szFileName[MAX_PATH] = "";
	OPENFILENAME ofn;
	
    switch(msg) {
		case WM_CREATE:
			HFONT hfDefault;
			HWND hLoadEdit;
			HWND hLoadButton;
			HWND hSaveEdit;
			HWND hSaveButton;
			HWND hConvertButton;
		
			hLoadEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL, 10, 10, 300, 21, hwnd, (HMENU)ID_LOADEDIT, GetModuleHandle(NULL), NULL);
			hLoadButton = CreateWindowEx(0, "BUTTON", "Input", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 320, 10, 70, 21, hwnd, (HMENU)ID_LOADBUTTON, GetModuleHandle(NULL), NULL);
			hSaveEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL, 10, 41, 300, 21, hwnd, (HMENU)ID_SAVEEDIT, GetModuleHandle(NULL), NULL);
			hSaveButton = CreateWindowEx(0, "BUTTON", "Output", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 320, 41, 70, 21, hwnd, (HMENU)ID_SAVEBUTTON, GetModuleHandle(NULL), NULL);
			hConvertButton = CreateWindowEx(0, "BUTTON", "Convert", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 400, 10, 80, 52, hwnd, (HMENU)ID_CONVERTBUTTON, GetModuleHandle(NULL), NULL);

			hfDefault = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
			SendMessage(hLoadEdit, WM_SETFONT, (WPARAM)hfDefault, MAKELPARAM(FALSE, 0));
			SendMessage(hLoadButton, WM_SETFONT, (WPARAM)hfDefault, MAKELPARAM(FALSE, 0));
			SendMessage(hSaveEdit, WM_SETFONT, (WPARAM)hfDefault, MAKELPARAM(FALSE, 0));
			SendMessage(hSaveButton, WM_SETFONT, (WPARAM)hfDefault, MAKELPARAM(FALSE, 0));
			SendMessage(hConvertButton, WM_SETFONT, (WPARAM)hfDefault, MAKELPARAM(FALSE, 0));
			break;
        case WM_CLOSE:
            DestroyWindow(hwnd);
	        break;
        case WM_DESTROY:
            PostQuitMessage(0);
    	    break;
    	case WM_COMMAND:
			switch(wParam) {
				case ID_LOADBUTTON:
					ZeroMemory(&ofn, sizeof(ofn));

					ofn.lStructSize = sizeof(ofn);
					ofn.hwndOwner = hwnd;
					ofn.lpstrFilter = "Log Files (*.log)\0*.log\0Log Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";
					ofn.lpstrFile = szFileName;
					ofn.nMaxFile = MAX_PATH;
					ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
					ofn.lpstrDefExt = "log";

					if(GetOpenFileName(&ofn)) {
						HWND hLoadEdit = GetDlgItem(hwnd, ID_LOADEDIT);
						SetWindowText(hLoadEdit, szFileName);
					}
					break;
				case ID_SAVEBUTTON:
					ZeroMemory(&ofn, sizeof(ofn));

					ofn.lStructSize = sizeof(ofn);
					ofn.hwndOwner = hwnd;
					ofn.lpstrFilter = "HTML Files (*.html)\0*.html\0RTF Files (*.rtf)\0*.rtf\0Text Files (*.txt)\0*.txt\0";
					ofn.lpstrFile = szFileName;
					ofn.nMaxFile = MAX_PATH;
					ofn.Flags = OFN_EXPLORER | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
					ofn.lpstrDefExt = "html";

					if(GetSaveFileName(&ofn)) {
						HWND hSaveEdit = GetDlgItem(hwnd, ID_SAVEEDIT);
						SetWindowText(hSaveEdit, szFileName);
					}
					break;
				case ID_CONVERTBUTTON:
					HWND hLoadEdit = GetDlgItem(hwnd, ID_LOADEDIT);
					HWND hLoadButton = GetDlgItem(hwnd, ID_LOADBUTTON);
					HWND hSaveEdit = GetDlgItem(hwnd, ID_SAVEEDIT);
					HWND hSaveButton = GetDlgItem(hwnd, ID_SAVEBUTTON);
					
					char loadFilename[MAX_PATH] = "";
					char saveFilename[MAX_PATH] = "";
					
					FILE * loadFile, * saveFile;

					GetWindowText(hLoadEdit, loadFilename, MAX_PATH);
					GetWindowText(hSaveEdit, saveFilename, MAX_PATH);

					if (strcmp(loadFilename, saveFilename) == 0) {
						MessageBox(hwnd, "Can not overwrite input file with output file.", "Error", MB_ICONEXCLAMATION|MB_OK);
						break;
					}

					loadFile = fopen(loadFilename, "r");
					if (loadFile == NULL) {
						MessageBox(hwnd, "Opening file stream.", "Error", MB_ICONEXCLAMATION|MB_OK);
						break;
					}
					
					saveFile = fopen(saveFilename, "w+");
					if (saveFile == NULL) {
						MessageBox(hwnd, "Opening file stream.", "Error", MB_ICONEXCLAMATION|MB_OK);
						fclose(loadFile);
						break;
					}

					char * saveFileExt = strrchr(saveFilename,'.');
					char * line;
					int color = 7;
					
					if (strcmp(saveFileExt, ".html") == 0) {
						fputs("<html><head><style>body{background-color:gray}b{font-weight:normal}.r{color:red}.g{color:green}.y{color:yellow}.b{color:blue}.c{color:cyan}.m{color:magenta}.w{color:white}.l{color:black}</style></head><body><span class='w'>", saveFile);

						while (!feof(loadFile)) {
							line = (char *)malloc(sizeof(char)*512);
							memset(line, '\0', sizeof(char)*512);
							
							fgets(line, 512, loadFile);
							if(color != 7) {
								fputs("</b><b class=w>", saveFile);
								color = 7;
							}
							
							int n;
							for (n = 0; n < strlen(line); n++) {
								if(line[n] == '^') {
									switch (atoi(&line[n+1])) {
										case 1:
											if(color != 1) {
												color = 1;
												fputs("</b><b class=r>", saveFile);
											}
											break;
										case 2:
											if(color != 2) {
												color = 2;
												fputs("</b><b class=g>", saveFile);
											}
											break;
										case 3:
											if(color != 3) {
												color = 3;
												fputs("</b><b class=y>", saveFile);
											}
											break;
										case 4:
											if(color != 4) {
												color = 4;
												fputs("</b><b class=b>", saveFile);
											}
											break;
										case 5:
											if(color != 5) {
												color = 5;
												fputs("</b><b class=c>", saveFile);
											}
											break;
										case 6:
											if(color != 6) {
												color = 6;
												fputs("</b><b class=m>", saveFile);
											}
											break;
										case 7:
											if(color != 7) {
												color = 7;
												fputs("</b><b class=w>", saveFile);
											}
											break;
										case 0:
											if(color != 8) {
												color = 8;
												fputs("</b><b class=l>", saveFile);
											}
											break;
										default:
											fputc('^', saveFile);
											fputc(line[n+1], saveFile);
											break;
									}
									n++;
								}
								else if (line[n] == ':' && color != 7) {
									fputs("</b><b class=w>", saveFile);
									fputc(':', saveFile);
								}
								else if (line[n] == '\\' && color != 7) {
									fputs("</b><b class=w>", saveFile);
									fputc('\\', saveFile);
								}
								else if (line[n] == ' ' && line[n+1] == 'k' && line[n+2] == 'i' && line[n+3] == 'l' && line[n+4] == 'l' && line[n+5] == 'e' && line[n+6] == 'd' && line[n+7] == ' ' && color != 7) {
									fputs("</b><b class=w>", saveFile);
									fputc(' ', saveFile);
								}
								else if (line[n] == ' ' && line[n+1] == 'b' && line[n+2] == 'y' && line[n+3] == ' ' && color != 7) {
									fputs("</b><b class=w>", saveFile);
									fputc(' ', saveFile);
								}
								else if (line[n] == '<') {
									fputs("&lt;", saveFile);
								}
								else if (line[n] == '>') {
									fputs("&gt;", saveFile);
								}
								else if (line[n] == '&') {
									fputs("&amp;", saveFile);
								}
								else if (line[n] != '\n' && line[n] != '\r') {
									fputc(line[n], saveFile);
								}
							}
							
							fputs("<br>", saveFile);
							
							free(line);
						}
						
						fputs("</body></html>", saveFile);
					}
					else if (strcmp(saveFileExt, ".rtf") == 0) {
						fputs("{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033{\\fonttbl{\\f0\\fswiss\\fcharset0 Arial;}}{\\colortbl ;\\red255\\green0\\blue0;\\red0\\green255\\blue0;\\red255\\green255\\blue0;\\red0\\green0\\blue255;\\red255\\green0\\blue255;\\red0\\green255\\blue255;\\red255\\green255\\blue255;}\\margl1440\\margr1440\\vieww9000\\viewh8400\\viewkind0{\\*\\background {\\shp{\\*\\shpinst\\shpleft0\\shptop0\\shpright0\\shpbottom0\\shpfhdr0\\shpbxmargin\\shpbymargin\\shpwr0\\shpwrk0\\shpfblwtxt1\\shpz0\\shplid1025{\\sp{\\sn shapeType}{\\sv 1}}{\\sp{\\sn fFlipH}{\\sv 0}}{\\sp{\\sn fFlipV}{\\sv 0}}{\\sp{\\sn fillColor}{\\sv 12237498}}{\\sp{\\sn fFilled}{\\sv 1}}{\\sp{\\sn lineWidth}{\\sv 0}}{\\sp{\\sn fLine}{\\sv 0}}{\\sp{\\sn bWMode}{\\sv 9}}{\\sp{\\sn fBackground}{\\sv 1}}}}}\\pard\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\ql\\qnatural\\pardirnatural\\f0\\cf7 ", saveFile);

						while (!feof(loadFile)) {
							line = (char *)malloc(sizeof(char)*512);
							memset(line, '\0', sizeof(char)*512);
							
							fgets(line, 512, loadFile);
							if(color != 7) {
								fputs("\\cf7 ", saveFile);
								color = 7;
							}
							
							int n;
							for (n = 0; n < strlen(line); n++) {
								if(line[n] == '^') {
									switch (atoi(&line[n+1])) {
										case 1:
											if(color != 1) {
												color = 1;
												fputs("\\cf1 ", saveFile);
											}
											break;
										case 2:
											if(color != 2) {
												color = 2;
												fputs("\\cf2 ", saveFile);
											}
											break;
										case 3:
											if(color != 3) {
												color = 3;
												fputs("\\cf3 ", saveFile);
											}
											break;
										case 4:
											if(color != 4) {
												color = 4;
												fputs("\\cf4 ", saveFile);
											}
											break;
										case 5:
											if(color != 5) {
												color = 5;
												fputs("\\cf5 ", saveFile);
											}
											break;
										case 6:
											if(color != 6) {
												color = 6;
												fputs("\\cf6 ", saveFile);
											}
											break;
										case 7:
											if(color != 7) {
												color = 7;
												fputs("\\cf7 ", saveFile);
											}
											break;
										case 0:
											if(color != 8) {
												color = 8;
												fputs("\\cf8 ", saveFile);
											}
											break;
										default:
											fputc('^', saveFile);
											fputc(line[n+1], saveFile);
											break;
									}
									n++;
								}
								else if (line[n] == ':' && color != 7) {
									fputs("\\cf7 ", saveFile);
									fputc(':', saveFile);
								}
								else if (line[n] == '\\') {
									if (color != 7) fputs("\\cf7 \\\\", saveFile);
									else fputs("\\\\", saveFile);
								}
								else if (line[n] == ' ' && line[n+1] == 'k' && line[n+2] == 'i' && line[n+3] == 'l' && line[n+4] == 'l' && line[n+5] == 'e' && line[n+6] == 'd' && line[n+7] == ' ' && color != 7) {
									fputs("\\cf7 ", saveFile);
								}
								else if (line[n] == ' ' && line[n+1] == 'b' && line[n+2] == 'y' && line[n+3] == ' ' && color != 7) {
									fputs("\\cf7 ", saveFile);
								}
								else if (line[n] != '\n' && line[n] != '\r') {
									fputc(line[n], saveFile);
								}
							}
							
							fputs("\\par ", saveFile);
							
							free(line);
						}
						
						fputs("}", saveFile);
					}
					else {
						while (!feof(loadFile)) {
							line = (char *)malloc(sizeof(char)*513);
							memset(line, '\0', sizeof(char)*513);
							fgets(line, 512, loadFile);
							
							int n;
							for (n = 0; n < strlen(line); n++) {
								if(line[n] == '^') {
									switch (atoi(&line[n+1])) {
										case 1:
											//Skip and don't put anything.
											break;
										case 2:
											//Skip and don't put anything.
											break;
										case 3:
											//Skip and don't put anything.
											break;
										case 4:
											//Skip and don't put anything.
											break;
										case 5:
											//Skip and don't put anything.
											break;
										case 6:
											//Skip and don't put anything.
											break;
										case 7:
											//Skip and don't put anything.
											break;
										case 0:
											//Skip and don't put anything.
											break;
										default:
											fputc('^', saveFile);
											fputc(line[n+1], saveFile);
											break;
									}
									n++;
								}
								else {
									fputc(line[n], saveFile);
								}
							}

							free(line);
						}
					}

					fclose(loadFile);
					fclose(saveFile);

					MessageBox(NULL, "Server log successfully converted.", "Conversion Complete", MB_ICONASTERISK|MB_OK);

					break;
			}
			break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
	}

    return 0;
}
